package main

import "fmt"

/*
#意想不到的隐藏变量
*/
func main() {
	fmt.Println("变量作用域引起的变量隐藏错误")
	errorDemo()
}

func errorDemo() {
	/**
	一个块中声明的变量名可以在其内部块中重新声明，这个规则叫做变量隐藏。
	if语句内部的client变量使用的是短变量声明操作符（:=）,将函数调用结果分配给内部client变量，而不是外部的client变量
	因此，外部client变量为“”
	*/
	var client string = ""
	if true {
		client, err := createClient("1")
		if err != nil {
			fmt.Println(err.Error())
			return
		}
		fmt.Println("获取到客户端", client)
	}
	fmt.Println("使用客户端", client, "客户端为空")
}

// 在内部块中使用临时变量
func rightDemo1() {
	var client string = ""
	if true {
		//创建临时变量c
		c, err := createClient("1")
		if err != nil {
			fmt.Println(err.Error())
			return
		}
		//将临时变量分配给client
		client = c
		fmt.Println("获取到客户端", client)
	}
	fmt.Println("使用客户端", client)
}

// 在内部快中使用赋值操作符（=）
func rightDemo2() {
	// 需要创建err变量，因为赋值操作符（=）需要在已经声明了变量名的情况下才生效
	var client string = ""
	var err error
	if true {
		// 通过赋值操作符（=）直接分配给外面的两个已声明的变量
		client, err = createClient("1")
		if err != nil {
			fmt.Println(err.Error())
			return
		}
		fmt.Println("获取到客户端", client)
	}
	fmt.Println("使用客户端", client)
}

func createClient(name string) (string, error) {
	return name, nil
}
